package com.kot.botrunningsystem.service.impl.utils;

import com.kot.botrunningsystem.utils.BotInterface;
import org.joor.Reflect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.UUID;

@Component
public class Consumer extends Thread {
    private Bot bot;
    private static RestTemplate restTemplate;//用于向backend传递信息
    private final static String receiveBotMoveUrl = "http://127.0.0.1:3000/pk/receive/bot/move/";//向backend传信息的url

    @Autowired//注入
    public void setRestTemplate(RestTemplate restTemplate) {
        Consumer.restTemplate = restTemplate;
    }

    public void startTimeout(long timeout, Bot bot) {//最多执行的时间
        this.bot = bot;
        this.start();//此处，会开一个新的线程去执行run()，当前线程会从下面执行join()
        try {//下面用于控制执行时间
            this.join(timeout);  // 阻塞timeout秒，run()超过timeout没运行完，就运行下面的中断当前线程
            //比sleep()的优势在于可以提前结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            this.interrupt();  // 中断当前线程
        }
    }

    private String addUid(String code, String uid) {  // 在code中的Bot类名后添加uid，
        // 就是在public class Bot impleme...中Bot后面+id
        int k = code.indexOf(" implements com.kot.botrunningsystem.utils.BotInterface");
        //在类全名public class Bot implements com.kob.botrunningsystem.utils.BotInterface 中
        //找到 implements com.kob.botrunningsystem.utils.BotInterface字符串的索引，也就是Bot之后字符的索引
        return code.substring(0, k) + uid + code.substring(k);//在这中间加上uid
    }

    @Override
    public void run() {
//        UUID uuid = UUID.randomUUID();//每次生成一个极大概率不会重复的ID（很长）
//        String uid = uuid.toString().substring(0, 8);//（变成字符串取前八位当id）
//
//        //bot实现了botInterface接口
//        BotInterface botInterface = Reflect.compile(//这来自于导入的joor包，能动态编译代码;第一个参数是类路径，第二个参数是类具体代码
//                "com.kot.botrunningsystem.utils.Bot" + uid,//此编译同名只会编译一次，所以加一个不会重复的id，确保每次都编译
//                //注意这个类是service/utils包下的Bot类，专门用于接受bot的控制代码
//                addUid(bot.getBotCode(), uid)//加号uid之后的代码
//        ).create().get();//编译完成后，创建一个对象，并获取到
//        //此时获得自编译后得到的类

        BotInterface botInterface = new com.kot.botrunningsystem.utils.Bot();

        Integer direction = botInterface.nextMove(bot.getInput());//

        System.out.println("move-direction: " + bot.getUserId() + " " + direction);

        MultiValueMap<String, String> data = new LinkedMultiValueMap<>();
        data.add("user_id", bot.getUserId().toString());
        data.add("direction", direction.toString());

        restTemplate.postForObject(receiveBotMoveUrl, data, String.class);
    }
}
